package frames;

import javax.swing.WindowConstants;

import decoraciones.Barcos;
import decoraciones.Nubes;
import logica.SkyNet;
import balas.Bala;
import naves.Jugador;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;

import javax.swing.JPanel;

/**
 * 
 * @author Martin Castro
 *
 */
public class JFrameJuego extends javax.swing.JFrame {
	private JPanel jPanelNivel;
	private SkyNet skynet;
	private JPanel jPanelGameOver;
	private JLabel jLabelNube;
	private JPanel jPanelNubes;
	private JLabel jLabelBarco2;
	private JLabel jLabelBarco1;
	private JPanel jPanelBarcos;
	private JLabel jLabelAgua;
	private JPanel jPanelAgua;
	private JLabel jLabelGameOver;
	private Jugador naveJugador;
	private JToolBar jToolBarBottom;
	private JLabel jButtonVida1;
	private JLabel jButtonVida2;
	private JLabel jButtonVida3;
	private JSeparator jSeparator2;
	private JLabel jLabelBomba1;
	private JLabel jLabelBomba2;
	private JLabel jLabelBomba3;
	private JSeparator jSeparator3;
	private JLabel jLabelPuntaje;
	private String nombreNave;
	
	/**
	* Auto-generated main method to display this JFrame
	*/
		
	public JFrameJuego(String nave) {
		super();
		this.nombreNave=nave;
		setResizable(false);
		initGUI();
		initGame();
		startGame();
	}
	
	private void startGame() {
		
		Barcos barcos = new Barcos(this);
		barcos.start();
		
		Nubes nubes = new Nubes(this);
		nubes.start();
		
		skynet.start();
		
	}

	private void initGame() {

		this.skynet = new SkyNet(this);
		
		this.naveJugador = new Jugador(this.skynet,this.nombreNave);

		this.skynet.setAmigo(this.naveJugador);
		
		this.jPanelNivel.add(this.naveJugador);
		
		this.naveJugador.setLocation(300, 650);
		
	}

	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			getContentPane().setSize(590, 770);
			{
				jPanelGameOver = new JPanel();
				jPanelGameOver.setBounds(0, 0, 600, 800);
				getContentPane().add(jPanelGameOver);
				jPanelGameOver.setLayout(null);
				jPanelGameOver.setBackground(new java.awt.Color(0,0,0));
				jPanelGameOver.setVisible(false);
				{
					jLabelGameOver = new JLabel();
					jPanelGameOver.add(jLabelGameOver);
					//jLabelGameOver.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-juego-game-over.jpg")));
					jLabelGameOver.setBounds(78, 390, 500, 365);
				}
			}
			this.addWindowListener(new WindowAdapter() {
				public void windowClosed(WindowEvent evt) {
					thisWindowClosed(evt);
				}
			});
			this.addKeyListener(new KeyAdapter() {
				public void keyPressed(KeyEvent evt) {
					thisKeyPressed(evt);
				}
			});
			{
				jToolBarBottom = new JToolBar();
				jToolBarBottom.setLocation(0, 710);
				jToolBarBottom.setSize(600, 90);
				jToolBarBottom.setLayout( new FlowLayout(FlowLayout.LEFT));
				getContentPane().add(jToolBarBottom, BorderLayout.SOUTH);
				jToolBarBottom.setBackground(new java.awt.Color(123,146,154));
				jToolBarBottom.setFloatable(false);
				jToolBarBottom.setVisible(true);
				{
					jButtonVida1 = new JLabel();
					jToolBarBottom.add(jButtonVida1);
					jButtonVida1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-disponible.png")));
					jButtonVida1.setOpaque(false);
					jButtonVida1.setFocusable(false);

					jButtonVida2 = new JLabel();
					jToolBarBottom.add(jButtonVida2);
					jButtonVida2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-disponible.png")));
					jButtonVida2.setOpaque(false);
					jButtonVida2.setFocusable(false);

					jButtonVida3 = new JLabel();
					jToolBarBottom.add(jButtonVida3);
					jButtonVida3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-disponible.png")));
					jButtonVida3.setOpaque(false);
					jButtonVida3.setFocusable(false);
				}
				{
					jSeparator2 = new JSeparator();
					jToolBarBottom.add(jSeparator2);
					jSeparator2.setOrientation(SwingConstants.VERTICAL);
					jSeparator2.setSize(50, 48);
					jSeparator2.setPreferredSize(new java.awt.Dimension(10, 48));
				}
				{
					jLabelBomba1 = new JLabel();
					jToolBarBottom.add(jLabelBomba1);
					jLabelBomba1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-disponible.png")));
					jLabelBomba1.setFocusable(false);

					jLabelBomba2 = new JLabel();
					jToolBarBottom.add(jLabelBomba2);
					jLabelBomba2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-disponible.png")));
					jLabelBomba2.setFocusable(false);

					jLabelBomba3 = new JLabel();
					jToolBarBottom.add(jLabelBomba3);
					jLabelBomba3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-usada.png")));
					jLabelBomba3.setFocusable(false);
				}
				{
					jSeparator3 = new JSeparator();
					jToolBarBottom.add(jSeparator3);
					jSeparator3.setOrientation(SwingConstants.VERTICAL);
					jSeparator3.setPreferredSize(new java.awt.Dimension(150, 48));
				}
				{
					jLabelPuntaje = new JLabel();
					jToolBarBottom.add(jLabelPuntaje);
					jLabelPuntaje.setText("0000");
					jLabelPuntaje.setFont(new java.awt.Font("Andale Mono",1,26));
					jLabelPuntaje.setForeground(new java.awt.Color(165,42,42));
					jLabelPuntaje.setFocusable(false);
				}
			}
			
			
			{
				jPanelNivel = new JPanel();
				jPanelNivel.setBounds(0, 0, 590, 770);
				getContentPane().add(jPanelNivel);
				jPanelNivel.setLayout(null);
				jPanelNivel.setBackground(new java.awt.Color(173,216,230));
				jPanelNivel.setOpaque(false);
			}
			{
				jPanelNubes = new JPanel();
				jPanelNubes.setBounds(0, 0, 600, 800);
				getContentPane().add(jPanelNubes);
				jPanelNubes.setLayout(null);
				jPanelNubes.setOpaque(false);
				{
					jLabelNube = new JLabel();
					jPanelNubes.add(jLabelNube);
					jLabelNube.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-cloud.png")));
					jLabelNube.setBounds(0, -541, 512, 512);
				}
			}
			{
				jPanelBarcos = new JPanel();
				jPanelBarcos.setBounds(0, 0, 600, 800);
				getContentPane().add(jPanelBarcos);
				jPanelBarcos.setLayout(null);
				jPanelBarcos.setOpaque(false);
				{
					jLabelBarco1 = new JLabel();
					jPanelBarcos.add(jLabelBarco1);
					jLabelBarco1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-barco1.png")));
					jLabelBarco1.setBounds(436, -461, 48, 350);
				}
				{
					jLabelBarco2 = new JLabel();
					jPanelBarcos.add(jLabelBarco2);
					jLabelBarco2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-barco2.png")));
					jLabelBarco2.setBounds(94, -277, 46, 248);
				}
			}
			{
				jPanelAgua = new JPanel();
				jPanelAgua.setBounds(0, 0, 600, 800);
				BorderLayout jPanelAguaLayout = new BorderLayout();
				getContentPane().add(jPanelAgua);
				jPanelAgua.setLayout(jPanelAguaLayout);
				jPanelAgua.setBackground(new java.awt.Color(161,204,161));
				{
					jLabelAgua = new JLabel();
					jPanelAgua.add(jLabelAgua, BorderLayout.CENTER);
					jLabelAgua.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-agua.png")));
				}
			}
			
			
			
			
			pack();
			this.setSize(600, 800);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}

	public JPanel getJPanelNivel(){
		return this.jPanelNivel;
	}
	
	public void agregarObjeto(Bala bec) {
		this.jPanelNivel.add(bec);		
	}

	public void eliminarObjeto(Bala b) {
		this.jPanelNivel.remove(b);		
	}

	/**
	 * @param b Objeto para chequear su Localizacion en pantalla
	 * @return Verdadero si el objeto esta fuera de pantalla, y falso en caso contrario
	 */
	public boolean estaFueraDePantalla(Bala b) {
		return( ( b.getLocation().x > this.getWidth() ) || ( b.getLocation().y > this.getHeight() ) );
	}

	public JLabel getBarco1() {
		return this.jLabelBarco1;
	}
	
	public JLabel getBarco2() {
		return this.jLabelBarco2;
	}

	public JLabel getNube() {
		return this.jLabelNube;
	}
	
	private void thisKeyPressed(KeyEvent evt) {
		this.movimientoJugador(evt.getKeyCode());
	}

	private void movimientoJugador(int keyCode) {
		Point pos = this.naveJugador.getLocation();	
		int factor = 10;
		switch(keyCode) {
		case KeyEvent.VK_UP: {
			int v = pos.y - factor;
			if(v<0)
				pos.setLocation(pos.x,0);
			else
				pos.setLocation(pos.x, v);
			break;
		}
		case KeyEvent.VK_DOWN: {
			int v = pos.y + factor;
			if(v>jPanelNivel.getHeight()-90)
				pos.setLocation(pos.x,jPanelNivel.getHeight()-90);
			else
				pos.setLocation(pos.x, v);
			break;
		}
		case KeyEvent.VK_LEFT: {
			int v = pos.x - factor;
			if(v<0)
				pos.setLocation(0, pos.y);
			else
				pos.setLocation(v, pos.y);

			break;
		}
		case KeyEvent.VK_RIGHT: {
			int v = pos.x + factor;
			if(v>this.jPanelNivel.getWidth()-30)
				pos.setLocation(jPanelNivel.getWidth()-30, pos.y);
			else
				pos.setLocation(v, pos.y);
			break;
		}
			case KeyEvent.VK_A: {
				this.naveJugador.disparar();
				break;
			}
			case KeyEvent.VK_S: {
				this.naveJugador.disparoBomba();
				break;
			}

		}
		this.naveJugador.setLocation(pos);
		
	}
	
	private void thisWindowClosed(WindowEvent evt) {
		System.exit(0);
	}

	/**
	 * Comando que setea el fin del juego
	 * @param fin si es verdadero, el jugador gano el juego, sino perdio
	 */
	public void gameOver(boolean fin) {
		if(fin==false)
			jLabelGameOver.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-juego-game-over.jpg")));
		else
			jLabelGameOver.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/youWon.jpg")));
		this.jPanelGameOver.setVisible(true);
	}
	
	/**
	 * @param i puntaje para agregar (o restar) al puntaje del jugador
	 */
	public void setPuntaje(int i){
		int total=Integer.parseInt(this.jLabelPuntaje.getText().toString());
		total+=i;
		if(total<0)
			this.jLabelPuntaje.setText("0");
		else
			this.jLabelPuntaje.setText(Integer.toString(total));

	}
	
	/**
	 * funcion que resta una vida al jugador
	 * @param cantVidas vidas que poseia el jugador antes de ser golpeado
	 */
	public void restarVida(int cantVidas){
		if(cantVidas==3)
			this.jButtonVida3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-usada.png")));
		else
			if(cantVidas==2)
				this.jButtonVida2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-usada.png")));
			else
				if(cantVidas==1)
					this.jButtonVida1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-vida-usada.png")));
	}
	
	/**
	 * funcion que resta una bomba al jugador si la uso
	 * @param cantBombas cantidad de vbombas que tenia el jugador antes de usar una
	 */
	public void restarBomba(int cantBombas){
		if(cantBombas==1)
			jLabelBomba1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-usada.png")));
		else
			if(cantBombas==2)
				jLabelBomba2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-usada.png")));
			else
				if(cantBombas==3)
					jLabelBomba3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-usada.png")));
	}
	
	/**
	 * funcion que suma una bomba a los objetos que posee
	 * @param cantBombas cantidad de bombas que el jugador tenia antes de obtener una
	 */
	public void sumarBomba(int cantBombas){
		if(cantBombas==0)
			jLabelBomba1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-disponible.png")));
		else
			if(cantBombas==1)
				jLabelBomba2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-disponible.png")));
			else
				if(cantBombas==2)
					jLabelBomba3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/tdp-bomba-disponible.png")));
	}
	
	public String getPuntaje(){
		return this.jLabelPuntaje.getText().toString();
	}
	
}
